package cn.broadsense.thrid.param;

import cn.broadsense.thrid.result.EvPlanTaskResult;
import cn.hutool.core.collection.CollUtil;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * 添加编排任务
 *
 * @author pengxin
 * @date 2022-10-09 16:11
 */
@NoArgsConstructor
@Data
public class EvPlanTaskParam extends BaseParam {

    private static final long serialVersionUID = -705399318061392701L;
    /**
     * 任务名称必填
     */
    private String planTaskName;
    /**
     * 任务Id必填
     */
    private String planTaskId;
    /**
     * 必填 指定 视频流1，图片流0。 2
     */
    private Integer analysisType;
    /**
     * 选填，自启动true，不启动false。
     */
    private Boolean autoStart;
    /**
     * 类型int。选填，任务来源或去向，0本级任务，1来自上级的任务，2下发至下级的任务，3 xc5300下发，默认0本级。
     */
    private Integer taskSource;
    /**
     * 当analyseType为2时，该字段必填，任务时间内，通道执行间隔时间，单位秒；取值不能小于算子设置的最小单元,单帧检测（图片）30秒（建议300秒），多帧检测120秒。该参数必须大于30s，且为30s的倍数，且不能超出开始时间和结束时间
     */
    private Integer channelIntervalSecond;
    /**
     * 通道算法信息
     */
    private List<ChannelAlgorithmInfosParam> channelAlgorithmInfos;
    /**
     * 选填，规则编排信息。
     */
    private OrchestrationParam orchestration;


    @Override
    public void checkParam() {

    }

    @Override
    public Class getResultClass() {
        return EvPlanTaskResult.class;
    }

    @NoArgsConstructor
    @Data
    public static class OrchestrationParam {
        /**
         * 必填(需要编排任务的情况下必填)，一次性任务（DISPOSABLE）以及循环任务（CYCLE）
         */
        private String orchestrationType = "CYCLE";
        /**
         * 一次性任务有效,开始日期结束日期
         */
        private DisposableParam disposable;
        /**
         * 类型array。选填，分析时间段，不填表示全天执行
         */
        private List<AnalysisPeriodsParam> analysisPeriods;
        /**
         * 循环任务
         */
        private CycleParam cycle = new CycleParam();
        /**
         * 当analyseType为1时 有效，选填，轮训策略。
         */
        private PollingParam polling;

        @NoArgsConstructor
        @Data
        public static class DisposableParam {
            /**
             * 开始日期yyyy-MM-dd
             */
            private String startDate;
            /**
             * 结束日期yyyy-MM-dd
             */
            private String endDate;
        }

        @NoArgsConstructor
        @Data
        public static class CycleParam {
            private List<Integer> dayOfWeek = CollUtil.newArrayList(1,2,3,4,5,6,7);
        }

        @NoArgsConstructor
        @Data
        public static class PollingParam {
            /**
             * 开启轮训策略。
             */
            private Boolean enable;
            /**
             * 必填，每次轮巡时长单位：分钟。
             */
            private Integer pollingInterval;
            /**
             * 必填，每次轮巡并发通道
             */
            private Integer pollingCount;
        }

        @NoArgsConstructor
        @Data
        public static class AnalysisPeriodsParam {
            /**
             * 开始时间 08:00:00
             */
            private String startTime;
            /**
             * 结束时间 09:00:00
             */
            private String endTime;
        }
    }

    @NoArgsConstructor
    @Data
    public static class ChannelAlgorithmInfosParam {
        /**
         * 通道编码必填
         */
        private String channelCode;
        /**
         * channelName：类型string。选填，通道名称。
         */
        private String channelName;
        private String gbCode;
        /**
         * 算法id 必填
         */
        private String algorithmId;
        /**
         * 规则信息 必填
         */
        private String config;
    }
}
